package main

import "fmt"

func main() {
	// 定义结构体
	type Person struct {
		name string
		age  int
	}
	// 结构体实例化
	p1 := Person{name: "Alice", age: 30}
	fmt.Println("Person 1:", p1)
	var p2 Person
	p2.name = "Bob"
	p2.age = 25
	fmt.Println("Person 2:", p2)

	// new 创建结构体指针
	ptr := new(Person)
	ptr.name = "Charlie"
	ptr.age = 28
	fmt.Println("Person Pointer:", *ptr)
	// 在 C/C++ 语言中，使用 new 实例化类型后，访问其成员变量时必须使用 -> 操作符。
	// 在go中直接访问Go语言为了方便开发者访问结构体指针的成员变量，使用了语法糖（Syntactic sugar）技术，将 ins.Name 形式转换为 (*ins).Name。
	fmt.Println("ptr's name:", ptr.name) // 通过指针访问字段


	// 取结构体的地址实例化
	// 在Go语言中，对结构体进行 & 取地址操作时，视为对该类型进行一次 new 的实例化操作
	p3 := &Person{name: "David", age: 35}
	fmt.Println("Person 3:", *p3)
}
